package com.cancer.common.util;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import com.cancer.common.web.PagingContext;

/**
 * 一个带有链式的map，方便参数处理
 *
 * @author 刘俊
 * @time 2015年7月10日
 */
public class ParamMap<K, V> {
	private ConcurrentHashMap<K, V>  map = new ConcurrentHashMap<K, V>();
	
	public static ParamMap<String, Object> create() {
		
		return new ParamMap<String, Object>();
	}
	
	/**
	 * 存放键值对
	 * 
	 * @author 刘俊 2015年8月26日
	 * @param key
	 * @param val
	 * @return
	 */
	public ParamMap<K, V> put(K key, V val) {
		map.put(key, val);
		
		return this;
	}
	
	/**
	 * 根据键删除值
	 * 
	 * @author 刘俊 2015年8月26日
	 * @param key
	 * @return
	 */
	public ParamMap<K, V> remove(K key) {
		map.remove(key);
		
		return this;
	}
	
	/**
	 * 获取到存储的map
	 * 
	 * @author 刘俊 2015年8月26日
	 * @return
	 */
	public Map<K, V> get() {
		
		return map;
	}
	
	/**
	 * <pre>
	 * 返回一个map，并将PagingContext中的pageOffset、pageSize和orders放入
	 * 
	 * pageOffset	: 其实记录位置
	 * pageSize		: 页大小
	 * orders		: 排序组
	 * 		property  : 排序列名
	 * 		direction : 排序方向
	 * </pre>
	 * @author 刘俊 2015年8月26日
	 * @return
	 */
	public Map<String, Object> getMybatisParams() {
		@SuppressWarnings("unchecked")
		ConcurrentHashMap<String, Object> params = (ConcurrentHashMap<String, Object>) map;
		params.putIfAbsent("pageOffset", PagingContext.calcOffset());
		params.putIfAbsent("pageSize", PagingContext.getPageSize());
		params.put("orders", PagingContext.getSort());
		
		return params;
	}
	
	/**
	 * 将保存的键值json序列化
	 * 
	 * @author 刘俊 2015年8月26日
	 * @return
	 */
	public String toJSON() {
		
		return JSONUtil.objToJson(map);
	}
	
	/**
	 * 将保存的键值url参数序列化
	 * 
	 * @author 刘俊 2015年8月26日
	 * @return
	 */
	public String toURL() {
		StringBuilder params = new StringBuilder();
		
		Set<K> keys = map.keySet();
		for (K k : keys) {
			params.append(k.toString()).append("=").append(map.get(k) == null ? "" : map.get(k)).append("&"); 
		}
		
		try {
			return params.substring(0, params.length() - 1);
		} catch (Exception e) {}
		
		return "";
		
//		return map.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&"));
	}
	
}
